package br.com.firula.web;

import java.io.IOException;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import br.com.firula.bo.AdministradorBO;
import br.com.firula.bo.TipoUsuarioBO;
import br.com.firula.bo.UsuarioBaseBO;
import br.com.firula.to.AdministradorTO;
import br.com.firula.to.BaseTO;
import br.com.firula.to.TipoUsuarioTO;
import br.com.firula.to.UsuarioBaseTO;
import br.com.firula.util.Md5;
import br.com.firula.util.Utils;
import br.com.firula.web.filter.Filtro;

public class AdministradorAction  extends GenericAction{
	private static final long serialVersionUID = 2179764708755481853L;
	
	private AdministradorBO mgrAdministrador;
	private TipoUsuarioBO mgrTipoUsuario;
	private UsuarioBaseBO mgrUsuarioBase;

	@Autowired
    public void setAdministradorBO(AdministradorBO administradorBO) {
        this.mgrAdministrador = administradorBO;
    }

	@Autowired
	public void setTipoUsuarioBO(TipoUsuarioBO tipoUsuarioBO) {
		this.mgrTipoUsuario = tipoUsuarioBO;
	}
	
	@Autowired
	public void setUsuarioBaseBO(UsuarioBaseBO usuarioBaseBO) {
		this.mgrUsuarioBase = usuarioBaseBO;
	}
	
	public String login(){
		AdministradorTO adm = (AdministradorTO) request.getSession().getAttribute("ADMINISTRADOR");
		if (adm == null){
			String email = request.getParameter("email");
			String senha = request.getParameter("senha");
			if (email != null && senha != null){
				UsuarioBaseTO usuarioBase = new UsuarioBaseTO();
				usuarioBase.setEmail(email);
				usuarioBase.setSenha(Md5.getHash(senha));
				Filtro usuarioFiltro = new Filtro();
				usuarioFiltro.setClazz(UsuarioBaseTO.class);
				usuarioFiltro.setExample(usuarioBase);
				List<UsuarioBaseTO> usuarioList = mgrUsuarioBase.getList(usuarioFiltro);
				if (usuarioList == null || usuarioList.size() == 0){
					//request.setAttribute("erro", "Dados inv�lidos");
					return "index";
				}else{
					request.getSession().setAttribute("ADMINISTRADOR", usuarioList.get(0));
					try {
						response.sendRedirect("/firula/adm/painel");
					} catch (IOException e) {
						e.printStackTrace();
					}
					return null;
				}
			}else{
				//request.setAttribute("erro", "Dados inv�lidos");
				return "index";
			}
		}else{
			try {
				response.sendRedirect("/firula/adm/painel");
			} catch (IOException e) {
				e.printStackTrace();
			}
			return null;
		}
	}

	public String logout(){
		request.getSession().setAttribute("ADMINISTRADOR", null);
		try {
			response.sendRedirect("/firula");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	public String painel(){
		return "painel";
	}

    public String edit() {
    	String id = request.getParameter("id");

    	AdministradorTO adm = new AdministradorTO();
		if (id != null && !id.equalsIgnoreCase("")){
			adm = mgrAdministrador.getAdministradorById(id);
		}
		request.setAttribute("adm", adm);

		Filtro tipoUsuarioFiltro = new Filtro();
		tipoUsuarioFiltro.setClazz(TipoUsuarioTO.class);
		tipoUsuarioFiltro.setExample(new TipoUsuarioTO());
		request.setAttribute("tipoUsuarioList", mgrTipoUsuario.getList(tipoUsuarioFiltro));

		return "edit";
    }

	public String list(){
		AdministradorTO administrador = new AdministradorTO();
		Filtro administradorFiltro = new Filtro();
		administradorFiltro.setClazz(AdministradorTO.class);
		administradorFiltro.setExample(administrador);
		administradorFiltro.setPageSize(Integer.MAX_VALUE);
		request.setAttribute("administradorList", mgrAdministrador.getList(administradorFiltro));
		request.setAttribute("resultSize", mgrAdministrador.getListCount(administradorFiltro));
		return "listAdm";
	}

	public String save(){
		AdministradorTO adm = new AdministradorTO();
		String id = request.getParameter("adm.id");
		String nome = request.getParameter("adm.nome");
		String sobrenome = request.getParameter("adm.sobrenome");
		String apelido = request.getParameter("adm.apelido");
		String email = request.getParameter("adm.email");
		String senha = request.getParameter("adm.senha");
		String sexo = request.getParameter("adm.sexo");
		String dataNascimento = request.getParameter("adm.dataNascimento");
		String tipoUsuarioId = request.getParameter("adm.tipoUsuario.id");

		adm.setId((Utils.verificaCampoValido(id) ? Long.valueOf(id) : null));
		adm.setNome(nome);
		adm.setSobrenome(sobrenome);
		adm.setApelido(apelido);
		adm.setEmail(email);
		if (Utils.verificaCampoValido(id)){
			String senhaOld = mgrAdministrador.getAdministradorById(id).getSenha();
			if (senhaOld.equalsIgnoreCase(senha)){
				adm.setSenha(senha);
			}else{
				adm.setSenha(Md5.getHash(senha));
			}
		}else{
			adm.setSenha(Md5.getHash(senha));
		}
		adm.setSexo(sexo);
		//adm.setDataNascimento(Date.valueOf(dataNascimento));
		adm.setDataNascimento(new Date());
		adm.setTipoUsuario(mgrTipoUsuario.getTipoUsuarioById(tipoUsuarioId));
		mgrAdministrador.save(adm);

		try {
			response.sendRedirect("/firula/adm/painel/administrador/list");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	public String delete(){
		String id = request.getParameter("id");
		AdministradorTO adm = mgrAdministrador.getAdministradorById(id);
		adm.setRemovido(true);
		mgrAdministrador.save(adm);

		try {
			response.sendRedirect("/firula/adm/painel/administrador/list");
		} catch (IOException e) {
			e.printStackTrace();
		}
		return null;
	}

	@Override
	protected BaseTO getNew() {
		return null;
	}

}
